package com.zjt.web.api;

import com.zjt.entity.product.Knowledge;
import com.zjt.service.product.ICodeService;
import com.zjt.service.product.IKnowledgeService;
import com.zjt.service.product.ISecurityCodeService;
import com.zjt.service.user.IClientUserService;
import com.zjt.web.api.vo.base.RecordVO;
import com.zjt.web.api.vo.base.SecurityVO;
import com.zjt.web.api.vo.base.StateVO;
import com.zjt.web.api.vo.request.BarcodeSecurityCodeReqVO;
import com.zjt.web.api.vo.request.BarcodeValidateReqVO;
import com.zjt.web.api.vo.response.BarcodeSecurityCodeRespVO;
import com.zjt.web.api.vo.response.BarcodeValidateRespVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: xueyanbeijing
 * Date: 12-8-14
 * Time: AM10:51
 * 条形码接口 ，包括：
 * 1.条形码防伪知识
 * 2.条形码防伪编码识别
 */

@Controller
@RequestMapping(value = "/api/barcode")
public class BarcodeAPIController {
    private static Logger logger = LoggerFactory.getLogger(BarcodeAPIController.class);
    private ICodeService codeService;
    private IClientUserService clientUserService;
    private IKnowledgeService knowledgeService;
    private ISecurityCodeService securityCodeService;


    @Autowired
    public void setSecurityCodeService(ISecurityCodeService securityCodeService) {
        this.securityCodeService = securityCodeService;
    }

    @Autowired
    public void setCodeService(ICodeService codeService) {
        this.codeService = codeService;
    }
    @Autowired
    public void setClientUserService(IClientUserService clientUserService) {
        this.clientUserService = clientUserService;
    }

    @Autowired
    public void setKnowledgeService(IKnowledgeService knowledgeService) {
        this.knowledgeService = knowledgeService;
    }


    /**
     * 条形码防伪知识
     *根据产品id取
     * @param barcodeValidateReqVO
     * @return
     */
    @RequestMapping(value = {"validate.json", ""})
    @ResponseBody
    public BarcodeValidateRespVO validate(BarcodeValidateReqVO barcodeValidateReqVO) {
        logger.info("/api/barcode/validate request parms = " + barcodeValidateReqVO.toString());
        //TODO 进行请求参数的解析
        StateVO stateVO = new StateVO();
        RecordVO recordVO = null;
        try
        {
            //TODO 用户未注册，也可以扫描结果
            recordVO = this.codeService.validateByBarCode(barcodeValidateReqVO.getBarcode(), barcodeValidateReqVO.getType(), barcodeValidateReqVO.getUserId());
            if (this.clientUserService.checkExistByUserId(barcodeValidateReqVO.getUserId()))
            {
                stateVO.setCode(0);
                stateVO.setMsg("OK");
            }else
            {
                stateVO.setCode(-1);
                stateVO.setMsg("client userId 不存在");
                logger.error("client userId 不存在");
            }
        }catch (Exception e){e.printStackTrace();}
        BarcodeValidateRespVO barcodeValidateRespVO = new BarcodeValidateRespVO();
        //TODO 进行业务逻辑的处理 ， 封装应答数据
        barcodeValidateRespVO.setActivityVO(null);//厂家有奖活动
        //TODO 取产品的防伪信息，构造成STRING  从Knowledge表中读取
        String knowledgeString = "";
        try{
            List<Knowledge> knowledgeList = this.knowledgeService.getKnowledgeListByBarCode(barcodeValidateReqVO.getBarcode());
            if (knowledgeList!=null&&knowledgeList.size()>0)
            {
               String tempTitle = "";
               for (Knowledge knowledge:knowledgeList)
               {
                   //if (!tempTitle.equalsIgnoreCase(knowledge.getTitle()))
                   //     knowledgeString = knowledgeString + knowledge.getTitle()+"\n";
                   // else
                       knowledgeString = knowledge.getTitle() + "\n"+knowledge.getContent()+"\n";
                   //tempTitle = knowledge.getTitle();
                   logger.info("/api/barcode/validate knowledge tempTitle = " + tempTitle);
               }
            }

        }catch (Exception e){
        }
        SecurityVO securityVO = new SecurityVO();
        knowledgeString= "商品知识\n" +
                "\n" +
                "　　冷却肉指严格执行兽医卫生检疫制度下屠宰后的畜胴体迅速进行冷却处理，使胴体温度在24小时内降为0～4℃，并在后续加工、流通和销售过程中始终保持0～4℃的生鲜肉，也有人称之为预冷肉或排酸肉。\n" +
                "\n" +
                "　　冷却肉的加工是在正常屠宰后畜胴体迅速进行冷却处理，冷却可以是一段进行，也可分为两段进行。一段进行即始终在0～4℃下进行;两段冷却是先在-10℃以下冷却1～2小时，然后在0～4℃下冷却，使胴体的中心温度达到0～4℃。冷却效果两段为好。由于冷却肉经过充分的解僵成熟过程，所以肉质柔软有弹性，滋味鲜美，汁液流失少，避免了营养成分的损失，比热鲜肉和冷冻肉更适合家庭烹调和肉制品加工。热鲜肉由于基本未经过解僵成熟过程，在僵直期内煮不烂，味道不好。冷冻肉对于畜禽肉的保鲜起到了很好的作用，但由于在冻结过程中会破坏肉的细胞。在解冻时会产生汁液流失，同时带走了部分营养。一般冻结方法汁液流失达5%～7%，所以经过冻结的肉口味不如冷却肉。\n" +
                "\n" +
                "　　冷却肉由于在分割、加工、流通和销售过程中始终处于低温控制中，大多数微生物的生长繁殖受到抑制，一些病源菌分泌毒素的速度大大降低，甚至被抑制，所以冷却肉的安全性比较有保证。\n" +
                "\n" +
                "　　冷却肉产品一般都以分割肉小包装的形式出现在较大型的有专用冷藏柜销售的超市商场，农贸市场出售的肉均为热鲜肉和冷冻肉。\n" +
                "\n" +
                "　　冷却肉生产一般都是比较大型屠宰企业，整个过程都有较好的卫生管理，屠宰加工时肉的初始菌含量少，加上合理的包装，并严格控制运输、销售过程中的温度，这样使冷却肉的货架期达到15天以上。在销售过程中，由于肌红蛋白被氧化，使鲜红色变为暗红色或褐色，这是正常的颜色变化，不影响肉的内在质量。\n" +
                "\n" +
                "　　质量要求与技术标准\n" +
                "\n" +
                "　　目前，国内外对肉的卫生和安全都很重视，对肉的新鲜度和含菌量制定标准进行限制，如德国将冷却肉的含菌量限定为5.0×106个/克，当肉的含菌量小于5.5×106个/克时为合格，亮绿灯，含菌量等于5.0×106个/克时为可以接受，亮黄灯，含菌量大于5.0×106个/克时不可食用，亮红灯。我国国家标准GB18406.3-2001《无公害畜禽肉》中规定：鲜畜禽肉菌落总数不高于1.0×106个/克，大肠菌群不高于1.0×104个/100克;冻畜禽肉菌落总数不高于5.0×105个/克，大肠菌不高于1.0×103个/100克，均高于国际上一些国家的同类标准。同时国家标准GB9959.1-2001《鲜、冻片猪肉》中规定：肉的新鲜度挥发性盐基氮≤20毫克/100克;含水量≤77%。" ;

        securityVO.setKnowledge(knowledgeString);
        securityVO.setSecurityCode(true);//暂时不实现此处功能，如果将来厂商接入第三方的防伪说明，再开启并实现此功能。
        barcodeValidateRespVO.setSecurityVO(securityVO);    //产品除了真假通防伪之个的防伪码
        barcodeValidateRespVO.setRecordVO(recordVO);
        barcodeValidateRespVO.setStateVO(stateVO);

        //TODO 开始处理返回文字值说明
        String codeValueString0 = "经查,该商品条码未在中国物品编码中心注册";
        String codeValueString1 = "经查,该商品条码已在中国物品编码中心注册";
        String codeValueString2 = "经查,该商品条码已在中国物品编码中心注册，仅登记厂家信息,商品信息未按规定通报";
        String codeValueString3 = "经查,该厂商识别代码已注销，请关于产品生产日期";
        String codeValueFoot = "请在产品包装上找到防伪码";

        if (recordVO!=null)
        {
            if (securityVO.isSecurityCode())
            {
                if (recordVO.getCodeValueStatus()<=0)
                    securityVO.setCheckReturnString(codeValueString0+","+codeValueFoot+".");
                if (recordVO.getCodeValueStatus()==1)
                    securityVO.setCheckReturnString(codeValueString1+","+codeValueFoot+".");
                if (recordVO.getCodeValueStatus()==2)
                    securityVO.setCheckReturnString(codeValueString2+","+codeValueFoot+".");
                if (recordVO.getCodeValueStatus()==3)
                    securityVO.setCheckReturnString(codeValueString3+","+codeValueFoot+".");
            }else
            {
                if (recordVO.getCodeValueStatus()<=0)
                    securityVO.setCheckReturnString(codeValueString0+".");
                if (recordVO.getCodeValueStatus()==1)
                    securityVO.setCheckReturnString(codeValueString1+".");
                if (recordVO.getCodeValueStatus()==2)
                    securityVO.setCheckReturnString(codeValueString2+".");
                if (recordVO.getCodeValueStatus()==3)
                    securityVO.setCheckReturnString(codeValueString3+".");
            }
        }

        logger.info("/api/barcode/validate response result = " + barcodeValidateRespVO.toString());
        return barcodeValidateRespVO;
    }

    /**
     * 条形码防伪编码识别,将来的接口，根据不同的厂家接入的安全验证，返回其结果
     * 暂时不开发
     * @param barcodeSecurityCodeReqVO
     * @return
     */
    @RequestMapping(value = {"code.json", ""})
    @ResponseBody
    public BarcodeSecurityCodeRespVO code(BarcodeSecurityCodeReqVO barcodeSecurityCodeReqVO) {
        logger.info("/api/barcode/code request parms = " + barcodeSecurityCodeReqVO.toString());
        //TODO 步骤：一 验证用户的有效性 二 验证条形是否存在
        BarcodeSecurityCodeRespVO barcodeSecurityCodeRespVO = new BarcodeSecurityCodeRespVO();
        StateVO stateVO = new StateVO();
        RecordVO recordVO = new RecordVO();

        try{
            //TODO 条形码和产品ID 有一个必填
            if (this.securityCodeService.getSecurityCodeByBarCode(barcodeSecurityCodeReqVO.getUserId(),barcodeSecurityCodeReqVO.getBarcode().trim())==null)
            {
                if (this.securityCodeService.getSecurityCodeByProductId(barcodeSecurityCodeReqVO.getUserId(),barcodeSecurityCodeReqVO.getProductId())==null)
                    this.securityCodeService.saveSecurityCode(barcodeSecurityCodeReqVO.getUserId(),barcodeSecurityCodeReqVO.getProductId(),barcodeSecurityCodeReqVO.getBarcode(),barcodeSecurityCodeReqVO.getSecurityCode());
            }
        }catch (Exception e)
        {
            logger.error("controller---防伪码异常");
        }

        //TODO response
        barcodeSecurityCodeRespVO.setStateVO(stateVO);
        barcodeSecurityCodeRespVO.setRecordVO(recordVO);
        logger.info("/api/barcode/code response result = " + barcodeSecurityCodeRespVO.toString());
        return barcodeSecurityCodeRespVO;
    }
}
